/**
 * 
 */
package mm.back.dao.impl;

import genericos.dao.exeptions.PersistanceException;
import genericos.dao.exeptions.PersistenceServiceException;

import java.util.List;

import mm.back.dao.MMAbstractDAO;
import mm.back.dao.ReparacionDAO;
import mm.back.entity.Reparacion;
import mm.back.filtros.ReparacionesFiltro;
import mm.exceptions.MMGenericException;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;

/**
 * @author PUSDERKIS
 *
 */
@Repository("reparacionDAO")
public class ReparacionDAOImpl extends MMAbstractDAO implements ReparacionDAO {

	/**
	 * @see mm.back.dao.ReparacionDAO#guardarReparacion(mm.back.entity.Reparacion)
	 */
	public void guardarReparacion(Reparacion reparacion)
			throws MMGenericException {
		try{
			if (logger.isDebugEnabled()){
				logger.debug("se intenta guardar la reparacion...");
			}

			universalHibernateDAO.getHibernateSession().saveOrUpdate(reparacion);
			
			if(logger.isDebugEnabled()){
				logger.debug("reparacion guardado correctamente. ID: "+reparacion.getId());
			}
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al guardar la reparacion en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Fallo al guardar la reparacion en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (PersistanceException e) {
			logger.error("Fallo al guardar la reparacion en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}

	}

	/**
	 * @see mm.back.dao.ReparacionDAO#getReparacion(java.lang.Long)
	 */
	public Reparacion getReparacion(Long id) throws MMGenericException {
		try{
			if (logger.isDebugEnabled()){
				logger.debug("recuperando la reparacion #" + id);
			}

			Reparacion reparacion = (Reparacion) universalHibernateDAO.get(Reparacion.class, id);
			
			if(logger.isDebugEnabled()){
				logger.debug("Reparacion recuperada con exito: "+reparacion);
			}
			return reparacion;
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al recuperar la reparacion en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Fallo al recuperar la reparacion en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}
	}

	/**
	 * @see mm.back.dao.ReparacionDAO#searchReparaciones(mm.back.filtros.ReparacionesFiltro)
	 */
	@SuppressWarnings("unchecked")
	public List<Reparacion> searchReparaciones(ReparacionesFiltro filtro)
			throws MMGenericException {
		
		StringBuffer sQuery = new StringBuffer();
		
		sQuery.append("SELECT rep FROM Reparacion rep INNER JOIN rep.vendedor ven WHERE 1 = 1 ");
		sQuery.append(filtro.getWhereClause("rep","ven"));
		
		try{
			if (logger.isDebugEnabled()){
				logger.debug("recuperando lista de reparaciones: " + filtro);
			}

			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery.toString());
			
			filtro.setWhereParameters(query);
			
			List<Reparacion> reparaciones = query.list();
			
			if(logger.isDebugEnabled()){
				logger.debug("Se recuperaron: " + reparaciones.size() +" con exito.");
			}
			
			return reparaciones;
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al recuperar las reparaciones en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (HibernateException e) {
			logger.error("Fallo al recuperar las reparaciones en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		} catch (PersistanceException e) {
			logger.error("Fallo al recuperar las reparaciones en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}
	}

}
